home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 684 / 684.xpi / chrome / fireftp.jar / content / js / etc / queueTree.js < prev    next >
Text File  |  2009-09-27  |  17KB  |  404 lines

  1. var queueTree = {
  2.   data                : new Array(),
  3.   rowCount            : 0,
  4.   failed              : new Array(),
  5.  
  6.   getParentIndex      : function(row)               { return -1; },
  7.   getLevel            : function(row)               { return 0;  },
  8.   getRowProperties    : function(row, props)        { },
  9.   getColumnProperties : function(colid, col, props) { },
  10.   isContainer         : function(row)               { return false; },
  11.   isSeparator         : function(row)               { return false; },
  12.   isSorted            : function(row)               { return false; },
  13.   setTree             : function(treebox)           { this.treebox = treebox; },
  14.  
  15.   getCellText         : function(row, column)       {                                           // text for the files
  16.     if (row >= 0 && row < this.data.length) {
  17.       switch(column.id) {
  18.         case "queuesource":
  19.           return this.data[row].source;
  20.         case "queuedest":
  21.           return this.data[row].dest;
  22.         case "queuebytes":
  23.           return this.data[row].size;
  24.         case "queueela":
  25.           return this.data[row].ela;
  26.         case "queuerem":
  27.           return this.data[row].remain;
  28.         case "queuerate":
  29.           return this.data[row].rate;
  30.         case "queuepercent":
  31.           return "";
  32.         case "queuetype":
  33.           return this.data[row].type;
  34.         case "queuestatus":
  35.           return this.data[row].status;
  36.         default:
  37.           return " ";
  38.       }
  39.     }
  40.  
  41.     return "";
  42.   },
  43.  
  44.   getCellValue : function(row, col) {
  45.     if (row >= 0 && row < this.data.length && col.id == "queuepercent") {
  46.       return this.data[row].percent;
  47.     }
  48.  
  49.     return 0;
  50.   }, 
  51.  
  52.   getImageSrc : function(row, col)  {
  53.     return row >= 0 && row < this.data.length && col.id == "queuesource" && this.data[row].icon ? this.data[row].icon : "";
  54.   },
  55.  
  56.   cycleHeader : function(col) { },
  57.  
  58.   getCellProperties : function(row, col, props)   {
  59.     if (row >= 0 && row < this.data.length && this.data[row]) {
  60.       if (col.id == "queuesource") {
  61.         props.AppendElement(gAtomService.getAtom("nameCol"));
  62.       }
  63.     }
  64.   },
  65.  
  66.   getProgressMode : function(row, col) {
  67.     if (row >= 0 && row < this.data.length) {
  68.       return this.data[row].mode == "determined" ? Components.interfaces.nsITreeView.PROGRESS_NORMAL : Components.interfaces.nsITreeView.PROGRESS_NONE;
  69.     }
  70.  
  71.     return Components.interfaces.nsITreeView.PROGRESS_NONE;
  72.   },  
  73.  
  74.   // ****************************************************** updateView ***************************************************
  75.  
  76.   updateView : function() {
  77.         if ($('logQueueTabs').selectedIndex != 1) {
  78.             return;
  79.         }
  80.  
  81.     var selectedIds    = new Array();
  82.     var queueTreeItems = new Array();
  83.     var currentIndexId = this.selection.currentIndex >= 0 && this.selection.currentIndex < this.rowCount ? this.data[this.selection.currentIndex].id : -1;
  84.  
  85.     for (var x = 0; x < this.rowCount; ++x) {
  86.       if (this.selection.isSelected(x)) {
  87.         selectedIds.push(this.data[x].id);
  88.       }
  89.     }
  90.  
  91.     var found  = true;
  92.     var count  = 0;
  93.     var totalCount = 0;
  94.  
  95.     while (found) {
  96.       found = false;
  97.  
  98.       for (var x = 0; x < gMaxCon; ++x) {
  99.         if (count < gConnections[x].eventQueue.length) {
  100.           found = true;
  101.  
  102.           if (gConnections[x].eventQueue[count].cmd == "transferEnd") {
  103.             ++totalCount;
  104.             if (totalCount > 100) {   // save on CPU, only show first 500
  105.               break;
  106.             }
  107.  
  108.             var info     = gConnections[x].eventQueue[count].callback;
  109.  
  110.             var leafName = info.remotePath.substring(info.remotePath.lastIndexOf('/') + 1);
  111.  
  112.             var obj = {
  113.               id      : info.id,
  114.               source  : info.type == "download" ? info.remotePath : info.localPath,
  115.               dest    : info.type == "download" ? info.localPath  : info.remotePath,
  116.               size    : commas(info.size),
  117.               typeO   : info.transport,
  118.               type    : (info.type == "download" ? gStrbundle.getString("download") : (info.type == "fxp" ? "FXP" : gStrbundle.getString("upload"))) + (info.ascii == "A" ? " (ASCII)": ''),
  119.               icon    : "moz-icon://" + leafName + "?size=16",
  120.               ela     : '',
  121.               remain  : '',
  122.               rate    : '',
  123.               percent : '',
  124.               status  : '',
  125.               mode    : '',
  126.               failed  : false
  127.             };
  128.  
  129.             if ((gConnections[x].dataSocket && gConnections[x].dataSocket.id == info.id && info.type == "upload" && gConnections[x].dataSocket.progressEventSink.compressStream)
  130.              || (info.transport == 'fxp'  && gFtp.eventQueue.length > 1 && gFtp.eventQueue[1].cmd == "transferEnd" && gFtp.eventQueue[1].callback.id == info.id)
  131.              || (info.transport == 'sftp' && gFtp.eventQueue.length > 1 && gFtp.eventQueue[1].cmd == "transferEnd" && gFtp.eventQueue[1].callback.id == info.id)) {
  132.               obj.status          = gStrbundle.getString("transferring")
  133.                                  + (gConnections[x].security ? ", " + (gConnections[x].securityMode == "P" || gConnections[x].security == "sftp" ? gStrbundle.getString("dataEncrypted")
  134.                                                                                                                                                  : gStrbundle.getString("dataNotEncrypted")) : "");
  135.             } else if (gConnections[x].dataSocket && gConnections[x].dataSocket.id == info.id) {
  136.               var bytesTotal;
  137.               var bytesTransferred;
  138.               var bytesPartial;
  139.               var timeStart;
  140.  
  141.               if (info.type == "upload") {
  142.                 bytesTotal        = gConnections[x].dataSocket.progressEventSink.bytesTotal;
  143.                 bytesTransferred  = gConnections[x].dataSocket.progressEventSink.bytesUploaded;
  144.                 bytesPartial      = gConnections[x].dataSocket.progressEventSink.bytesPartial;
  145.                 timeStart         = gConnections[x].dataSocket.progressEventSink.timeStart;
  146.               } else {
  147.                 bytesTotal        = gConnections[x].dataSocket.dataListener.bytesTotal;
  148.                 bytesTransferred  = gConnections[x].dataSocket.dataListener.bytesDownloaded;
  149.                 bytesPartial      = gConnections[x].dataSocket.dataListener.bytesPartial;
  150.                 timeStart         = gConnections[x].dataSocket.dataListener.timeStart;
  151.               }
  152.  
  153.               if (bytesTotal) {
  154.                 var timeElapsed   = ((new Date()) - timeStart) / 1000;
  155.                 timeElapsed       = timeElapsed != 0 ? timeElapsed : 1;                         // no dividing by 0
  156.                 var averageRate   = ((bytesTransferred - bytesPartial) / 1024 / timeElapsed).toFixed(2);
  157.                 averageRate       = averageRate != 0 ? averageRate : "0.1";                     // no dividing by 0
  158.                 var timeRemaining = (bytesTotal - bytesTransferred) / 1024 * (1 / averageRate);
  159.                 averageRate       = averageRate.replace(/\./g, gStrbundle.getString("decimal")) + " " + gStrbundle.getString("kbsec");
  160.  
  161.                 var hours         = parseInt( timeElapsed / 3600);
  162.                 var min           = parseInt((timeElapsed - hours * 3600) / 60);
  163.                 var sec           = parseInt( timeElapsed - hours * 3600 - min * 60);
  164.                 obj.ela           = zeros(hours) + ":" + zeros(min) + ":" + zeros(sec);
  165.  
  166.                 hours             = parseInt( timeRemaining / 3600);
  167.                 min               = parseInt((timeRemaining - hours * 3600) / 60);
  168.                 sec               = parseInt( timeRemaining - hours * 3600 - min * 60);
  169.                 obj.remain        = zeros(hours) + ":" + zeros(min) + ":" + zeros(sec);
  170.  
  171.                 obj.rate          = averageRate;
  172.                 var total         = bytesTotal != 0 ? bytesTotal : 1;                           // no dividing by 0
  173.                 var progress      = parseInt(bytesTransferred / total * 100) + "%";
  174.                 obj.mode          = "determined";
  175.                 obj.percent       = progress;
  176.                 obj.size          = progress + " - " + commas(bytesTransferred) + " / " + commas(bytesTotal);
  177.                 obj.status        = gStrbundle.getString("transferring")
  178.                                   + (gConnections[x].security ? ", " + (gConnections[x].securityMode == "P" || gConnections[x].security == "sftp" ? gStrbundle.getString("dataEncrypted")
  179.                                                                                                                                                   : gStrbundle.getString("dataNotEncrypted")) : "");
  180.               } else if (gConnections[x].isConnected) {
  181.                 continue;
  182.               }
  183.             }
  184.  
  185.             queueTreeItems.push(obj);
  186.           }
  187.         }
  188.       }
  189.  
  190.       ++count;
  191.     }
  192.  
  193.     for (var x = 0; x < this.failed.length; ++x) {                                              // show failed transfers
  194.       var info     = this.failed[x];
  195.  
  196.       var leafName = info.remotePath.substring(info.remotePath.lastIndexOf('/') + 1);
  197.  
  198.       var obj = {
  199.         id      : info.id,
  200.         source  : info.type == "download" ? info.remotePath : info.localPath,
  201.         dest    : info.type == "download" ? info.localPath  : info.remotePath,
  202.         size    : commas(info.size),
  203.         typeO   : '',
  204.         type    : (info.type == "download" ? gStrbundle.getString("download") : (info.type == "fxp" ? "FXP" : gStrbundle.getString("upload"))) + (info.ascii == "A" ? " (ASCII)": ''),
  205.         icon    : "moz-icon://" + leafName + "?size=16",
  206.         ela     : '',
  207.         remain  : '',
  208.         rate    : '',
  209.         percent : '',
  210.         status  : gStrbundle.getString("error") + ": " + (info.reason == "checksum" ? gStrbundle.getString("checksum") : info.reason),
  211.         mode    : '',
  212.         failed  : true
  213.       };
  214.  
  215.       queueTreeItems.push(obj);
  216.     }
  217.  
  218.     var oldCount  = this.rowCount;
  219.     this.data     = queueTreeItems;                                                             // update queueTree
  220.     this.rowCount = this.data.length;
  221.     this.treebox.rowCountChanged(oldCount - 1, this.rowCount - oldCount);
  222.     this.treebox.invalidate();
  223.  
  224.     this.selection.clearSelection();
  225.     for (var x = 0; x < selectedIds.length; ++x) {                                              // reselect the rows that were selected
  226.       for (var y = 0; y < this.rowCount; ++y) {
  227.         if (selectedIds[x] == this.data[y].id && !this.selection.isSelected(y)) {
  228.           this.selection.toggleSelect(y);
  229.           break;
  230.         }
  231.       }
  232.     }
  233.  
  234.     for (var x = 0; x < this.rowCount; ++x) {
  235.       if (currentIndexId == this.data[x].id) {
  236.         this.selection.currentIndex = x;
  237.         break;
  238.       }
  239.     }
  240.   },
  241.  
  242.   retry : function() {                                                                          // retry items from queue
  243.     if (!gFtp.isConnected || this.selection.currentIndex < 0 || this.selection.currentIndex >= this.rowCount) {
  244.       return;
  245.     }
  246.  
  247.     var files = new Array();
  248.  
  249.     for (var x = 0; x < this.rowCount; ++x) {
  250.       if (this.selection.isSelected(x) && this.data[x].failed) {
  251.         for (var y = 0; y < this.failed.length; ++y) {
  252.           if (this.data[x].id == this.failed[y].id) {
  253.             files.push(this.failed[y]);
  254.             this.failed.splice(y, 1);
  255.             break;
  256.           }
  257.         }
  258.       }
  259.     }
  260.  
  261.     for (var x = 0; x < files.length; ++x) {
  262.       if (files[x].type == "upload") {
  263.         gFtp.upload(files[x].localPath, files[x].remotePath, false, files[x].size, -1);
  264.       } else if (files[x].type == "download") {
  265.         gFtp.download(files[x].remotePath, files[x].localPath, files[x].size, false, -1);
  266.       }
  267.     }
  268.   },
  269.  
  270.   addFailed : function(params, reason) {
  271.     params.reason = reason;
  272.     this.failed.push(params);
  273.   },
  274.  
  275.   cancel : function(zeFiles) {                                                                  // cancel items from queue
  276.     if (this.selection.currentIndex < 0 || this.selection.currentIndex >= this.rowCount) {
  277.       return;
  278.     }
  279.  
  280.     var files = new Array();
  281.  
  282.     if (zeFiles) {
  283.       files = zeFiles;
  284.     } else {
  285.       for (var x = 0; x < this.rowCount; ++x) {
  286.         if (this.selection.isSelected(x)) {
  287.           files.push(this.data[x]);
  288.         }
  289.       }
  290.     }
  291.  
  292.     for (var x = 0; x < files.length; ++x) {
  293.       var connNo = files[x].id.split('-');
  294.       connNo     = connNo[0] - 1;
  295.  
  296.       if (gConnections[connNo].dataSocket && gConnections[connNo].dataSocket.id == files[x].id) {
  297.         gConnections[connNo].cancel();
  298.       } else if (files[x].failed) {
  299.         for (var y = 0; y < this.failed.length; ++y) {
  300.           if (files[x].id == this.failed[y].id) {
  301.             this.failed.splice(y, 1);
  302.             break;
  303.           }
  304.         }
  305.       } else {
  306.         var begin = -1;
  307.         var end   = -1;
  308.  
  309.         for (var y = 0; y < gConnections[connNo].eventQueue.length; ++y) {
  310.           if (gConnections[connNo].eventQueue[y].cmd == "transferBegin" && gConnections[connNo].eventQueue[y].callback.id == files[x].id) {
  311.             begin = y;
  312.           } else if (gConnections[connNo].eventQueue[y].cmd == "transferEnd" && gConnections[connNo].eventQueue[y].callback.id == files[x].id) {
  313.             end   = y;
  314.             break;
  315.           }
  316.         }
  317.  
  318.         if (end != -1) {
  319.           gConnections[connNo].eventQueue.splice(begin, end - begin + 1);
  320.         }
  321.       }
  322.     }
  323.   },
  324.  
  325.   // ************************************************* keyEvent *****************************************************
  326.  
  327.   keyPress : function(event) {
  328.     if (this.selection.currentIndex < 0 || this.selection.currentIndex >= this.rowCount) {
  329.       this.selection.currentIndex = 0;
  330.     }
  331.  
  332.     if (testAccelKey(event) && (event.which == 65 || event.which == 97)) {
  333.       event.preventDefault();                                                                   // accel-a: select all
  334.       this.selection.selectAll();
  335.     } else if (event.ctrlKey && event.keyCode == 32 && this.selection.count != 0) {             // ctrl-space, select or deselect
  336.       this.selection.toggleSelect(this.selection.currentIndex);
  337.     } else if (event.keyCode  == 46 && this.selection.count != 0) {                             // del
  338.       this.cancel();
  339.     } else if (event.keyCode  == 93) {                                                          // display context menu
  340.       var x = {};    var y = {};    var width = {};    var height = {};
  341.       this.treebox.getCoordsForCellItem(this.selection.currentIndex, this.treebox.columns["queuesource"], "text", x, y, width, height);
  342.       this.createContextMenu();
  343.       $('queuemenu').showPopup(gQueueTreeChildren, gQueueTreeChildren.boxObject.x + 75, gQueueTreeChildren.boxObject.y + y.value + 5, "context");
  344.     }
  345.   },
  346.  
  347.   createContextMenu : function() {
  348.     var fxp   = false;
  349.     var sftp  = false;
  350.     var retry = false;
  351.  
  352.     for (var x = 0; x < this.rowCount; ++x) {
  353.       if (!this.selection.isSelected(x)) {
  354.         continue;
  355.       }
  356.  
  357.       if (this.data[x].typeO == 'fxp') {
  358.         fxp   = true;
  359.         break;
  360.       } else if (this.data[x].typeO == 'sftp') {
  361.         sftp  = true;
  362.         break;
  363.       } else if (this.data[x].failed) {
  364.         retry = true;
  365.       }
  366.     }
  367.  
  368.     $('queueRetry').setAttribute( "disabled", this.selection.currentIndex < 0 || this.selection.currentIndex >= this.rowCount || fxp || !retry);
  369.     $('queueCancel').setAttribute("disabled", this.selection.currentIndex < 0 || this.selection.currentIndex >= this.rowCount || fxp || sftp);
  370.   },
  371.  
  372.   // ************************************************* dropEvent *****************************************************
  373.  
  374.   canDrop : function(index, orient) {
  375.     if (!gFtp.isConnected || !dragObserver.origin) {
  376.       return false;
  377.     }
  378.  
  379.     return true;
  380.   },
  381.  
  382.   drop : function(index, orient) {
  383.     if (dragObserver.origin == 'localtreechildren') {
  384.       new transfer().start(false);
  385.     } else if (dragObserver.origin == 'remotetreechildren') {
  386.       new transfer().start(true);
  387.     } else if (dragObserver.origin == 'external') {
  388.       var transferObj           = new transfer();
  389.       transferObj.remoteRefresh = gRemotePath.value;
  390.  
  391.       for (var x = 0; x < dragObserver.externalFiles.length; ++x) {
  392.         var droppedFile    = dragObserver.externalFiles[x];
  393.         var fileParent     = droppedFile.parent ? droppedFile.parent.path : "";
  394.  
  395.         transferObj.start(false, droppedFile, fileParent, gRemotePath.value);
  396.  
  397.         if (transferObj.cancel) {
  398.           break;
  399.         }
  400.       }
  401.     }
  402.   }
  403. };
  404.